package org.ttitfly.workflow;

import java.io.Serializable;
import java.util.List;

import org.ttitfly.workflow.engine.run.ProcessInstance;
import org.ttitfly.workflow.engine.run.Task;
import org.ttitfly.workflow.exception.NoSessionConnectedException;
import org.ttitfly.workflow.exception.ProcessRunException;


/**
 * 工作流会话
 * 
 * <pre>
 * 与工作流服务器的会话信息，
 * 每一次与工作流引擎交互都先必须取先建立会话。
 * 客户端的所有操作都经由session进行，session的状态由工作流服务器维护
 * </pre>
 * 
 * @author 潘海春
 * @version 2009-1-11
 * @see WFRequest
 */
public interface Session extends WFRequest, Serializable {

	/**
	 * 会话人
	 * 
	 * @return
	 */
	String getPrincipal();

	/**
	 * 会话请求
	 * 
	 * @return
	 */
	WFRequest getRequest();

	/**
	 * 关闭
	 * 
	 * @throws NoSessionConnectedException
	 */
	void close() throws NoSessionConnectedException;

	/**
	 * 派生子session
	 * 
	 * @return
	 */
	Session fork();

	/**
	 * 当前运行的流程实例
	 * 
	 * @return
	 */
	ProcessInstance currentProcessInstance();

	/**
	 * 当前运行的任务
	 * 
	 * @return
	 */
	Task currentTask();

	/**
	 * 设置当前运行的流程实例
	 * 
	 * @param processInstance
	 * @return
	 */
	void setCurrent(ProcessInstance processInstance);

	/**
	 * 设置当前运行的任务
	 * 
	 * @param task
	 * @return
	 */
	void setCurrent(Task task);

	/**
	 * 执行默认处理器来启动流程
	 * 
	 * @param processName
	 *            流程名称
	 * @return
	 * @throws ProcessRunException
	 */
	ProcessInstance start(String processName) throws ProcessRunException;

	/**
	 * 执行指定名称的处理器来启动流程
	 * 
	 * @param processName
	 *            流程名称
	 * @param actionName
	 *            动作名称
	 * @return
	 * @throws ProcessRunException
	 */
	ProcessInstance start(String processName, String actionName)
			throws ProcessRunException;
	
	/**
	 * 删除流程实例
	 * 
	 * @param processInstanceId
	 */
	void deleteProcessInstance(int processInstanceId);

	/**
	 * 执行默认处理器来启动子流程
	 * 
	 * @param processName
	 *            流程名称
	 * @return
	 * @throws ProcessRunException
	 */
	ProcessInstance start(Task task, String processName)
			throws ProcessRunException;

	/**
	 * 执行指定名称的处理器来启动子流程
	 * 
	 * @param processName
	 *            流程名称
	 * @param actionName
	 *            动作名称
	 * @return
	 * @throws ProcessRunException
	 */
	ProcessInstance start(Task task, String processName, String actionName)
			throws ProcessRunException;

	/**
	 * 执行任务
	 * 
	 * @param 任务Id
	 *            任务id
	 * @throws ProcessRunException
	 */
	void execute(int taskId) throws ProcessRunException;

	/**
	 * 执行指定名称的处理器来执行活动
	 * 
	 * @param taskId
	 *            任务id
	 * @param actionName
	 *            动作名称
	 * @throws ProcessRunException
	 */
	void execute(int taskId, String actionName) throws ProcessRunException;
	
	/**
	 * 按条件统计当前用户运行中的任务数量
	 * @param processName 流程名称，精确匹配
	 * @param activityName 活动名称，模糊匹配
	 * @param processInstanceName 流程实例名称，全模糊匹配
	 * @return
	 */
	int countRunningTask(String processName, String activityName, int processInstanceId);
	
	/**
	 * 按条件统计当前用户关闭的任务数量
	 * @param processName 流程名称，精确匹配
	 * @param activityName 活动名称，模糊匹配
	 * @param processInstanceName 流程实例名称，全模糊匹配
	 * @return
	 */
	int countClosedTask(String processName, String activityName, int processInstanceId);
	
	/**
	 * 分页查询当前用户运行中的任务
	 * @param processName 流程名称，精确匹配
	 * @param activityName 活动名称，模糊匹配
	 * @param processInstanceName 流程实例名称，全模糊匹配
	 * @param start 开始下标，从0开始
	 * @param count 查询的数量，如果小于等于0认为是查询所有
	 * @return
	 */
	List<Task> findRunningTask(String processName, String activityName, int processInstanceId, int start, int count);
	
	/**
	 * 分页查询当前用户关闭的任务
	 * @param processName 流程名称，精确匹配
	 * @param activityName 活动名称，模糊匹配
	 * @param processInstanceName 流程实例名称，全模糊匹配
	 * @param start 开始下标，从0开始
	 * @param count 查询的数量，如果小于等于0认为是查询所有
	 * @return
	 */
	List<Task> findClosedTask(String processName, String activityName, int processInstanceId, int start, int count);

}
